/*
 ============================================================================
 Name        : tp2.c
 Author      : Ramiro Diaz
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include "listaEnlazada.h"
#include "bmp.h"
#include "tortuga.h"
#include "parser.h"

void repetir(tLista *lista, int cantidad, tTortuga *tortuga) {
	tNodo *siguiente;
    for (int i = 0;i < cantidad;i++) {
    	siguiente = lista->nodos;  // Principio de la lista.
    	while (siguiente) {
        	ejecutarInstruccion(tortuga, &siguiente->instruccion);
        	siguiente = (siguiente->siguienteNodo);
        }
    }
}

int main(int argc, char *argv[]) {
	tTortuga *tortuga = NULL;
	tLista *listaInstrucciones = NULL;
	FILE *log = NULL, *imagen = NULL;
	tInstruccion instruccion;	
	switch (argc) {
		case 2:
			log = stdin;
			break;
		case 3:
			log = fopen(argv[2], "r");
			break;
		default:
			exit(1);
	}
	if (log == NULL)
		exit(2);
	tortuga = (tTortuga *) malloc(sizeof(tTortuga));
	imagen = fopen(argv[1], "wb");
	inicializarTortuga(tortuga);
	inicializarInstruccion(&instruccion);
	do {
		instruccion = leerLog(log);
		if(instruccion.identificador == 'r' && instruccion.valor > 1) {
			alocarLista(&listaInstrucciones);
			do {  // identifica el bloque de instrucciones a repetir.
				instruccion = leerLog(log);
				agregar(listaInstrucciones, instruccion);
				ejecutarInstruccion(tortuga, &instruccion);
			} while (instruccion.identificador != 'e');

			repetir(listaInstrucciones, instruccion.valor - 1, tortuga);
			borrarLista(listaInstrucciones);
			free(listaInstrucciones);
		}
		else
			ejecutarInstruccion(tortuga, &instruccion);
	}while(!feof(log));
	crearImagen(imagen, tortuga->bm);
	fclose(log);
	fclose(imagen);
	liberarMatrizTortuga(tortuga->bm);
	borrarOperaciones(tortuga->operaciones);
	free(tortuga);
	exit(0);
}
